import QualityInspectionApi from '../../../common/api/feed/qualityinspectionList.api.js';
import doT from '../../../../vendor/template/doT.js';
import {
	auditStateToHtml
} from "../../../common/json-mapping/state-content-mapping.js";
import watermark from '../../../common/watermark.js';
import {
	requestFilePath
} from "../../../common/api/file-request.js";
import PrintHtmlToPdf from '../../../common/print-pdf/index.js';

(function(window, document, $) {
	const salesplanmainTemplate = doT.template($('#salesplanmain-template').text());
	let _vm, _res, resTotal = [],
		listindex = "",
		operatarr = ['编辑', '提交', '反提交', '审核', '反审核', '查看详情', '签署', '删除'], // 初始化操作数组
		index
	let _page = {
		pageSize: 10,
		pageIndex: 0,
		totalPages: -1,
	}

	// 全局函数：按钮显示控制（提升到全局作用域）
	const updateButtonVisibility = () => {
		console.log('[按钮显示] 开始更新按钮状态，共 ' + resTotal.length + ' 条数据');

		$('.looksale').each(function(idx) {
			// 安全检查：确保 idx 在 resTotal 范围内
			if (idx >= resTotal.length) {
				console.warn('[按钮显示] 索引越界:', idx, '总数:', resTotal.length);
				return;
			}

			let record = resTotal[idx];
			let billStatus = record.bizFormObj.billStatus;
			let $buttons = $(this).find('.action-buttons');

			console.log(`[按钮显示] 第${idx}行，单号: ${record.bizFormObj.billNo}, 状态: ${billStatus}`);

			// 先隐藏所有按钮
			$buttons.find('button').hide();

			// 根据状态显示按钮（参考deathbillslist的逻辑）
			switch(billStatus) {
				case 1: // 已保存
					$buttons.find('.delete').show();
					$buttons.find('.submit').show();
					$buttons.find('.edit').show();
					console.log(`[按钮显示] 第${idx}行显示: 删除、提交、编辑`);
					break;
				case 2: // 已提交
					$buttons.find('.unsubmit').show();
					$buttons.find('.audit').show();
					// 不显示删除按钮
					console.log(`[按钮显示] 第${idx}行显示: 反提交、审核`);
					break;
				case 3: // 已审核
					$buttons.find('.antiaudit').show();
					console.log(`[按钮显示] 第${idx}行显示: 反审核`);
					break;
				case 99: // 已删除
					console.log(`[按钮显示] 第${idx}行不显示任何按钮（已删除）`);
					break;
				default:
					console.warn(`[按钮显示] 第${idx}行未知状态: ${billStatus}`);
			}
		});
	}

	$(function() {
		_vm = new Vue({
			el: "#salesplanmain",
			data() {
				return {
					salesplanList: [],
					page: {
						..._page
					}
				}
			}
		});
		$('body').attr('data-weui-theme', 'light'); //强制光明模式

		// T003: 验证 Select2 插件是否已加载
		console.log('[Setup] Select2 version:', $.fn.select2 ? 'loaded' : 'NOT loaded');

		// 验证 updateButtonVisibility 函数是否正确定义
		console.log('[Setup] updateButtonVisibility 函数:', typeof updateButtonVisibility === 'function' ? '已定义' : '未定义');

		_initCommand();
		_search(); // 搜索
		_initSlide(); // 下拉加载
		_ctlReturn(); // 控制返回按钮，返回的页面
		pullLoad(); // 上拉加载
		_returnMain(); // 返回首页
		liststatues();
		_watermarkBgImg(); // 添加水印信息
	});

	// 命令初始化
	const _initCommand = () => {
		// 新增按钮
		$('#addsaleorders').on('click', function(e) {
			window.sessionStorage.removeItem("getEntryInfo");
			window.sessionStorage.removeItem("deliverDatas");
			window.sessionStorage.removeItem("ids");
			location.href = `addqualityiinspection.html?v=${Utils.GetTime()}`;
		});

		// 注释掉原有的三个点点击事件
		// $(document).on('click', '.ellipsis', function(e) {
		// 	$(document).off("click", ".looksale")
		// 	e.stopPropagation()
		// 	$(".saleElp").siblings('.detail').css('display', 'none')
		// 	$(this).parents(".salesplanstate").siblings('.detail').css('display', 'block')
		// 	index = $(this).parents('.looksale').index()
		// 	let billindex = resTotal[index].bizFormObj.billStatus
		// 	let $opration = $(this).parents('.saleElp').siblings('.detail')
		//
		// 	// 已保存状态 (billStatus=1)：隐藏审核、反审核、签署相关按钮
		// 	if (billindex === 1) {
		// 		$opration.find('.audit').css('display', 'none')
		// 		$opration.find('.antiaudit').css('display', 'none')
		// 		$opration.find('.signature').css('display', 'none')
		// 		$opration.find('.savesale').css('display', 'none')
		// 		$opration.find('.settle').css('display', 'none')
		// 		$opration.find('.generate').css('display', 'none')
		// 	}
		// 	// 已提交状态 (billStatus=2)：隐藏编辑、提交、反审核、签署按钮
		// 	else if (billindex === 2) {
		// 		$opration.find('.edit').css('display', 'none')
		// 		$opration.find('.submit').css('display', 'none')
		// 		$opration.find('.antiaudit').css('display', 'none')
		// 		$opration.find('.signature').css('display', 'none')
		// 		$opration.find('.subsale').css('display', 'none')
		// 		$opration.find('.settle').css('display', 'none')
		// 		$opration.find('.generate').css('display', 'none')
		// 	}
		// 	// 已审核状态 (billStatus=3)：只显示查看详情、签署、反审核按钮
		// 	else if (billindex === 3) {
		// 		$opration.find('.antiaudit').siblings().css('display', 'none')
		// 		$opration.find('.viewdetails').css('display', 'block')
		// 		$opration.find('.signature').css('display', 'block')
		// 		$opration.find('.antiaudit').css('display', 'block')
		// 	}
		// 	// 已删除状态 (billStatus=99)：隐藏所有操作按钮
		// 	else if (billindex === 99) {
		// 		$opration.find('li').css('display', 'none')
		// 	}
		// })

		// 点击功能可视区之外的区域
		$(document).bind("click", function(e) {
			var target = $(e.target);
			if (target.closest(".saleElp").length == 0) { //点击可视区域.saleElp之外的地方触发
				$(".saleElp").siblings('.detail').css('display', 'none')
			}
			// 点击整行跳转详情页面
			$(document).on('click', '.looksale', function(e) {
				$(document).off("click", ".looksale")
				index = $(this).index()
				location.href =
					`qualityinspectiondetail.html?v=${Utils.GetTime()}&id=${resTotal[index].id}`;
			})
		})

		// 点击整行跳转详情页面
		$(document).on('click', '.looksale', function(e) {
			e.stopPropagation()
			$(document).off("click", ".looksale")
			index = $(this).index()
			location.href =
				`qualityinspectiondetail.html?v=${Utils.GetTime()}&id=${resTotal[index].id}`;
		});

		// 操作
		$(document).on('click', '.saledetail li:not(.operation)', function(e) {
			e.stopPropagation()
			index = $(this).parents('.looksale').index()
			let operat = $(this).index()
			operatsales(resTotal[index].id, operat)
			$(this).parents('.detail').css('display', 'none')
		});

		// 查看详情功能已移除，点击卡片即可查看详情
		// 注释掉原有的编辑按钮事件（下拉菜单版）
		// $(document).on('click', '.edit', function(e) {
		// 	e.stopPropagation()
		// 	let id = $(this).data('id')
		// 	$(this).parents('.detail').css('display', 'none')
		// 	location.href = `../deathbills/adddeathbills.html?v=${Utils.GetTime()}&id=${id}`;
		// });

		// 新增：编辑按钮点击事件（weUI按钮版）
		$(document).on('click', '.action-buttons .edit', function(e) {
			e.stopPropagation();
			index = $(this).parents('.looksale').index();
			let id = $(this).data('id') || resTotal[index].id;
			location.href = `addqualityiinspection.html?v=${Utils.GetTime()}&id=${id}`;
		});

		// 新增：提交按钮点击事件
		$(document).on('click', '.action-buttons .submit', function(e) {
			e.stopPropagation();
			index = $(this).parents('.looksale').index();
			let id = $(this).data('id') || resTotal[index].id;
			operatsales(id, 1); // 提交 = operatarr[1]
		});

		// 新增：反提交按钮点击事件
		$(document).on('click', '.action-buttons .unsubmit', function(e) {
			e.stopPropagation();
			index = $(this).parents('.looksale').index();
			let id = $(this).data('id') || resTotal[index].id;
			operatsales(id, 2); // 反提交 = operatarr[2]
		});

		// 新增：审核按钮点击事件
		$(document).on('click', '.action-buttons .audit', function(e) {
			e.stopPropagation();
			index = $(this).parents('.looksale').index();
			let id = $(this).data('id') || resTotal[index].id;
			operatsales(id, 3); // 审核 = operatarr[3]
		});

		// 新增：反审核按钮点击事件
		$(document).on('click', '.action-buttons .antiaudit', function(e) {
			e.stopPropagation();
			index = $(this).parents('.looksale').index();
			let id = $(this).data('id') || resTotal[index].id;
			operatsales(id, 4); // 反审核 = operatarr[4]
		});

		// 新增：删除按钮点击事件
		$(document).on('click', '.action-buttons .delete', function(e) {
			e.stopPropagation();
			index = $(this).parents('.looksale').index();
			let id = $(this).data('id') || resTotal[index].id;
			// 由于operatarr数组顺序为['编辑', '提交', '反提交', '审核', '反审核', '查看详情', '签署', '删除']
			// 删除的索引应该是7
			operatsales(id, 7);
		});

		// 签署
		$(document).on('click', '.signature', function(e) {
			e.stopPropagation()
			index = $(this).parents('.looksale').index()
			$(this).parents('.detail').css('display', 'none')
			console.log('签署开始')
			$('#print-code-id').val(resTotal[index].id);
			_showPreviewModal(resTotal[index])
		});
	}

	// 提示
	const operatsales = (id, operat) => {
		$.modal({
			autoClose: false,
			title: `${operatarr[operat]}提示`,
			text: `<div class="weui-cells__group weui-cells__group_form" style="margin-top:-5px">
					<div  style="padding:5px;display:flex;justify-content: center; padding-bottom: 20px;">
						<div>是否确认${operatarr[operat]}<span style="color:red">[${resTotal[index].bizFormObj.billNo}]</span>单据？该操作无法撤销！</div>
					</div>`,
			buttons: [{
					text: "取消",
					className: "default",
					onClick: function() {
						$.closeModal();
					}
				},
				{
					text: "确定",
					onClick: function() {
						_initPage()
						switch (operatarr[operat]) {
							case '删除':
								QualityInspectionApi.deleteInspectionOrder(id).then(res => {
									_initDataTable();
									$.toptip('删除成功。', 'success');
									$.closeModal()
								})
								break; //找到之后，退出循环，不再执行下面的语句
							case '提交':
								QualityInspectionApi.submitInspectionOrder(id).then(res => {
									_initDataTable();
									$.toptip('提交成功。', 'success');
									$.closeModal()
								})
								break;
							case '反提交':
								QualityInspectionApi.resubmitInspectionOrder(id).then(res => {
									_initDataTable();
									$.toptip('反提交成功。', 'success');
									$.closeModal()
								}).catch(() => {
									_initDataTable();
									$.closeModal();
								})
								break;
							case '审核':
								QualityInspectionApi.auditInspectionOrder(id).then(res => {
									_initDataTable();
									$.toptip('审核成功。', 'success');
									$.closeModal()
								}).catch(() => {
									_initDataTable();
									$.closeModal();
								})
								break;
							case '反审核':
								QualityInspectionApi.reAuditInspectionOrder(id).then(res => {
									_initDataTable();
									$.toptip('反审核成功。', 'success');
									$.closeModal()
								}).catch(() => {
									_initDataTable();
									$.closeModal();
								})
								break;
						}
					}
				}
			]
		});
	}

	// 请求列表数据
	const _initDataTable = async () => {
		// 查询销售出库单H5列表
		let _data = _vm.page;
		QualityInspectionApi.getList(Object.assign({
			"searchInfo": $('#search-index').val(),
			"billStatus": listindex,
			sort: "bizFormObj.createTime desc"
		}, _data)).then(res => {
			_page = {
				pageSize: 10,
				pageIndex: _data.pageIndex + 1,
				totalPages: res.totalPages
			}
			_vm._data.page = Object.assign({}, _page);
			_res = res.items
			resTotal.push(..._res)
			_res.forEach(ele => {
				let confirm = []
				ele.billStatusCh = auditStateToHtml(ele.bizFormObj.billStatus)
				// 转换质检类型：1=原料质检, 2=成品质检
				ele.typeName = ele.type === 1 ? '原料质检' :
				               ele.type === 2 ? '成品质检' : '';
				// 转换质检结果：1=合格, 2=不合格
				ele.qualityResultsName = ele.qualityResults === 1 ? '合格' :
				                         ele.qualityResults === 2 ? '不合格' : '';
				if (ele.billStatus == 2) {
					ele.entries.forEach(item => {
						if (item.count == null) {
							confirm.push(item.count)
						}
					});
				}
				ele.confirmNum = confirm.length;
			});
			_vm.salesplanList = []
			_vm.salesplanList = [..._vm.salesplanList, ...resTotal];
			$('.looksale:last').css('margin-bottom', '10px')
			$('#salesplantel').empty().append(salesplanmainTemplate(_vm.salesplanList));
			// operatarr数组已经在顶部初始化，不再需要从DOM中提取
			// $('.looksale').eq(0).find('.saledetail').each(function(index, domele) {
			// 	operatarr = $(domele).text().trim().split(' ')
			// })
			$('.looksale:last').css('margin-bottom', '120px')

			// 调试：验证按钮渲染情况
			console.log('[按钮渲染] 数据加载完成，检查按钮状态...');
			$('.looksale').each(function(idx) {
				let visibleButtons = $(this).find('.action-buttons button:visible');
				console.log(`[按钮渲染] 第${idx}行有 ${visibleButtons.length} 个按钮可见`);
			});

			// 备用方案：如果模板渲染有问题，可以手动更新按钮显示状态
			// updateButtonVisibility();
		})
	}

	// 导航栏
	const liststatues = () => {
		$('#spleplan-navbar a').on('click', function() {
			listindex = Number($(this).index());
			$(this).addClass('weui-bar__item--on').siblings().removeClass('weui-bar__item--on');
			if (listindex === 0) {
				listindex = ""
			}
			_initPage()
			_initDataTable()
		});
	}

	// 搜索
	const _search = () => {
		// 表单提交
		$("#search_bar form").submit(function() {
			_initPage()
			_initDataTable();
			return false;
		});
		// 搜索框为空
		if (!Utils.IsNotNull($('#search-index').val())) {
			_initPage()
			_initDataTable()
		}
		// 取消搜索
		$('#search_cancel').on('click', function() {
			$('#search-index').val('')
			_initPage()
			_initDataTable()
		})
		// *
		$('#search_clear').on('click', function() {
			$('#search-index').val('')
			_initPage()
			_initDataTable()
		})
	}

	// 初始化分页
	const _initPage = () => {
		resTotal = []
		_page = {
			pageSize: 10,
			pageIndex: 0,
			totalPages: -1,
		}
		_vm._data.page = Object.assign({}, _page);
	}

	// 下拉加载
	const _initSlide = () => {
		//分别设置滑动距离，开始位置，结束位置，和模拟数据的定时器
		let disY, startY, endY, timer, t, pullheight;
		// 触摸开始
		$('#salesplantel').on('touchstart', function(e) {
			startY = e.originalEvent.changedTouches[0].pageY; //开始时的坐标
		});
		// 移动中
		$('#salesplantel').on('touchmove', function(e) {
			$(".saleElp").siblings('.detail').css('display', 'none')
			//点击整行跳转详情页面
			$(document).on('click', '.looksale', function(e) {
				$(document).off("click", ".looksale")
				index = $(this).index()
				location.href =
					`qualityinspectiondetail.html?v=${Utils.GetTime()}&id=${resTotal[index].id}`;
			});
			endY = e.originalEvent.changedTouches[0].pageY;
			disY = endY - startY; //移动后的坐标减去开始坐标，滑动距离。
			if (isTop() && disY > 0) {
				e.preventDefault();
			}
			if (disY < 60) {
				$('#pull-down').css({
					height: disY + 'px' //父盒子的高度随着滑动距离变化，有最大值。
				});
			} else {
				$('#pull-down').css({
					height: 60 + 'px' //父盒子的最大高度
				});
			}
			// 结束时
			$('#salesplantel').on('touchend', function(e) {
				clearInterval(timer);
				endY = e.originalEvent.changedTouches[0].pageY;
				disY = endY - startY;
				if (isTop() && disY > 0) {
					timer = setInterval(function() {
						$('#pull-down').css({
							height: 0 + 'px', //松手后的返回。
						});
						clearInterval(timer);
						_initPage()
						_initDataTable(); //加载数据 
					}, 300)
				} else {
					$('#pull-down').css({
						height: 0 + 'px', //松手后的返回。
					});
				}
				$('#salesplantel').off('touchend')
			})
		});
	}
	const isTop = () => {
		var t = document.documentElement.scrollTop || document.body.scrollTop;
		return t === 0 ? true : false;
	}

	//TODO : 上拉加载
	const pullLoad = () => {
		// 监听滚动的父容器
		$("body").infinite().on("infinite", function() {
			let _data = _vm._data.page;
			if (_data.pageIndex == _data.totalPages) return;
			let self = this;
			if (self.loading) return;
			self.loading = true;
			setTimeout(function() {
				_initDataTable();
				self.loading = false;
			}, 500); //模拟延迟
		});
	}

	// 控制返回按钮，返回的页面
	const _ctlReturn = () => {
		if (window.history && window.history.pushState) {
			history.pushState(null, null, document.URL);
			window.addEventListener('popstate', function() {
				history.pushState(null, null, document.URL);
				//跳转列表
				this.window.location = `../../../main.html`;
			});
		}
	}

	//返回首页
	const _returnMain = () => {
		$('#returnMain').on('click', function() {
			location.href = '../../../main.html'
		});
	}

	// 添加水印信息
	const _watermarkBgImg = () => {
		let _userInfo = JSON.parse(Utils.GetSessionStorage("SNAccountEply")) || {};
		watermark.set(_userInfo.name + _userInfo.numCode); // 水印
	}

	/**
	 * 显示死亡记录签署预览表单
	 * @param {Object} deathRecord - 死亡记录数据对象
	 * @param {Object} deathRecord.bizFormObj - 业务表单对象，包含 billNo, bizDate 等字段
	 * @param {string} deathRecord.farmerName - 养殖户姓名
	 * @param {string} deathRecord.deathCode - 死亡编码
	 * @param {string} deathRecord.reasonNames - 死亡原因
	 * @param {number} deathRecord.seedNum - 进苗头数
	 * @param {number} deathRecord.days - 死亡日龄
	 * @param {number} deathRecord.totalCount - 死淘数量
	 * @param {number} deathRecord.deaNum - 累计死亡
	 * @param {number} deathRecord.snum - 目前存栏
	 * @param {string} [deathRecord.printDate] - 签单日期，可选，默认为当前日期
	 */
	const _showPreviewModal = async (deathRecord) => {
		const startTime = performance.now();
		console.log('[Preview] 开始渲染预览表单');
		console.log('[Preview] 死亡记录原始数据:', deathRecord);

		// 参考 yy.html 项目：重置附件图片数组
		pdfListForImageUpload = [];

		try {
			// 参考 yy.html 项目：获取死亡记录详情（包含附件）
			const detail = await DeathbillsApi.getDeathList(deathRecord.id);
			console.log('[Preview] 死亡记录详情:', detail);

			// 参考 yy.html 项目实现：调用 getPrintBybatch API 获取完整数据
			const printData = await DeathbillsApi.getPrintBybatch({
				id: deathRecord.breedBatch.id,
				bizDate: deathRecord.bizFormObj.bizDate
			});

			console.log('[Preview] API 返回数据:', printData);

			// T011: 数据预处理，确保所有字段都有默认值
			// 参考 yy.html 项目：合并 deathRecord 和 printData
			const templateData = {
				billNo: deathRecord.bizFormObj?.billNo || '-',
				bizDate: deathRecord.bizFormObj?.bizDate ?
					moment(deathRecord.bizFormObj.bizDate).format('YYYY-MM-DD') : '-',
				printDate: moment().format('YYYY-MM-DD'),
				name: printData.name || '-', // 养户姓名来自 getPrintBybatch API
				deathCode: deathRecord.deathCode || '-',
				reasonNames: deathRecord.reasonNames || '-',
				seedNum: printData.seedNum || '-', // 来自 API
				days: deathRecord.days || '-',
				totalCount: deathRecord.totalCount || '-',
				deaNum: printData.deaNum || '-', // 来自 API
				snum: printData.snum || '-' // 来自 API
			};

			console.log('[Preview] 模板数据:', templateData);

			// T012: 渲染 doT 模板（添加 try-catch 错误处理）
			const previewTemplate = doT.template($('#deathbills-preview-template').text());
			const previewHtml = previewTemplate(templateData);

			// T013: 参考 yy.html 项目（第 258 行）：立即显示 WeUI 模态框（不等待附件）
			$.modal({
				title: '预览签署表单',
				text: previewHtml,
				buttons: [{
						text: '取消',
						className: 'default',
						onClick: function() {
							console.log('[Preview] 用户取消预览');
							$.closeModal();
						}
					},
					{
						text: '确认签署',
						onClick: async function() {
							console.log('[Preview] 用户确认签署');

							// 参考 yy.html 项目（第 299-311 行）：在确认签署时生成 PDF
							$.showLoading('生成PDF中...');
							try {
								const pdfStartTime = Date.now();
								const previewTemplate = doT.template($(
									'#deathbills-preview-template').text());

								// 重新调用 getPrintBybatch 获取最新数据
								const printData = await DeathbillsApi.getPrintBybatch({
									id: deathRecord.breedBatch.id,
									bizDate: deathRecord.bizFormObj.bizDate
								});

								const templateData = {
									billNo: deathRecord.bizFormObj?.billNo || '-',
									bizDate: deathRecord.bizFormObj?.bizDate ? moment(
										deathRecord.bizFormObj.bizDate).format(
										'YYYY-MM-DD') : '-',
									printDate: moment().format('YYYY-MM-DD'),
									name: printData.name || '-',
									deathCode: deathRecord.deathCode || '-',
									reasonNames: deathRecord.reasonNames || '-',
									seedNum: printData.seedNum || '-',
									days: deathRecord.days || '-',
									totalCount: deathRecord.totalCount || '-',
									deaNum: printData.deaNum || '-',
									snum: printData.snum || '-'
								};

								const previewHtml = previewTemplate(templateData);

								// 参考 yy.html 项目（第 302-303 行）：使用 PrintHtmlToPdf 实例生成 PDF
								// 创建临时容器来存放预览 HTML
								const tempContainer = document.createElement('div');
								tempContainer.id = 'temp-pdf-container';
								tempContainer.style.position = 'absolute';
								tempContainer.style.left = '-9999px';
								tempContainer.innerHTML =
									`<div class="death-record-pdf-content">${previewHtml}</div>`;
								document.body.appendChild(tempContainer);

								console.log('[确认签署] 临时容器已创建，开始生成PDF');

								try {
									// 实例化 PrintHtmlToPdf 并生成 PDF
									// 参考 yy.html:302 使用相同的 baseFileName
									const printer = new PrintHtmlToPdf('temp-pdf-container',
										'death-record-pdf-content', '神农集团-死亡记录单');
									const pdfList = await printer.run();

									// 移除临时容器
									document.body.removeChild(tempContainer);

									// 调试：打印 pdfList 的结构
									console.log('[确认签署] pdfList 结构:', pdfList);
									console.log('[确认签署] pdfList 类型:', typeof pdfList);
									console.log('[确认签署] pdfList 长度:', pdfList ? pdfList
										.length : 'undefined');
									if (pdfList && pdfList.length > 0) {
										console.log('[确认签署] pdfList[0] 结构:', pdfList[0]);
										console.log('[确认签署] pdfList[0] 的所有属性:', Object.keys(
											pdfList[0]));
									}

									if (!pdfList || pdfList.length === 0) {
										throw new Error('PDF 生成失败：返回结果为空');
									}

									// 参考 yy.html 项目（第 303 行）：直接存储 pdfList 数组
									// pdfList 格式为 [{name: 'xxx.pdf', html: '<div>...</div>'}]
									pdfListForUpload = pdfList;
									console.log('[确认签署] PDF 生成成功，共 ' + pdfListForUpload
										.length + ' 个文件');
								} catch (pdfError) {
									// 清理临时容器（如果存在）
									if (document.body.contains(tempContainer)) {
										document.body.removeChild(tempContainer);
									}
									throw pdfError;
								}

								const pdfDuration = Date.now() - pdfStartTime;
								console.log(`[确认签署] PDF生成完成，耗时: ${pdfDuration}ms`);

								$.hideLoading();
								$.closeModal();
								// 打开签署表单模态框
								_showSignatureModal(deathRecord);

							} catch (error) {
								$.hideLoading();
								console.error('[确认签署] PDF生成失败:', error);
								$.alert({
									title: 'PDF生成失败',
									text: error.message || 'PDF生成失败，请重试',
									onOK: () => {}
								});
							}
						}
					}
				]
			});

			// 参考 yy.html 项目（第 259-268 行）：在显示后异步处理附件（不阻塞 UI）
			if (Utils.IsNotNull(detail.attaches)) {
				console.log('[Preview] 发现附件:', detail.attaches);
				const imageIds = detail.attaches.split(',');

				// 使用立即执行的异步函数，不阻塞主流程
				(async () => {
					for (let i = 0; i < imageIds.length; i++) {
						try {
							const fileRes = await requestFilePath(imageIds[i]);
							if (fileRes && fileRes.isSucceed && fileRes.data) {
								pdfListForImageUpload.push(fileRes.data);
								console.log(`[Preview] 附件 ${i + 1}/${imageIds.length} 路径获取成功:`,
									fileRes.data);
							} else {
								console.warn(`[Preview] 附件 ${i + 1}/${imageIds.length} 路径获取失败:`,
									fileRes);
							}
						} catch (error) {
							console.error(`[Preview] 附件 ${i + 1}/${imageIds.length} 处理失败:`, error);
						}
					}
					console.log(`[Preview] 附件处理完成，共 ${pdfListForImageUpload.length} 个附件`);
				})();
			} else {
				console.log('[Preview] 该死亡记录没有附件');
			}

			// T014: 检查预览表单布局渲染（移除 addPositionIds 调用，该方法不存在）
			setTimeout(() => {
				try {
					// 检查表格渲染情况
					const previewContainer = document.querySelector('.death-record-preview');
					const contentWrapper = document.querySelector('.preview-content-wrapper');
					const table = document.querySelector('.preview-table');

					if (previewContainer && contentWrapper && table) {
						const containerWidth = previewContainer.offsetWidth;
						const contentWidth = contentWrapper.offsetWidth;
						const tableWidth = table.offsetWidth;

						console.log(
							`[Preview] 容器宽度: ${containerWidth}px, 内容宽度: ${contentWidth}px, 表格宽度: ${tableWidth}px`
						);

						// 判断是否会出现横向滚动
						if (contentWidth > containerWidth) {
							console.log('[Preview] 内容宽度超出容器，将显示横向滚动条');
						} else {
							console.log('[Preview] 内容在容器内完整显示，无需滚动');
						}

						console.log('[Preview] 布局渲染完成');
					} else {
						console.warn('[Preview] 未找到预览容器或表格元素');
					}
				} catch (error) {
					console.error('[Preview] 签署字段位置标记或布局检查失败:', error);
				}
			}, 200);

			// T023: 性能监控
			const endTime = performance.now();
			const renderTime = (endTime - startTime).toFixed(2);
			console.log(`[Preview] 渲染耗时: ${renderTime}ms`);

			if (renderTime > 500) {
				console.warn('[Preview] 渲染时间超过 500ms，需要优化');
			}

		} catch (error) {
			console.error('[Preview] 获取数据或渲染失败:', error);
			$.alert({
				title: '加载失败',
				text: error.message || '预览表单加载失败，请重试',
				onOK: () => {
					/* 关闭 */
				}
			});
		}
	}

	/**
	 * T008: 显示签署表单模态框
	 * 参考 research.md Decision 2: 使用 WeUI 模态框
	 * @param {Object} deathRecord - 死亡记录数据
	 */
	const _showSignatureModal = (deathRecord) => {
		// T034: 防止重复打开模态框 - 先关闭可能存在的旧模态框
		try {
			$.closeModal();
			console.log('[签署表单] 关闭可能存在的旧模态框');
		} catch (error) {
			// 忽略关闭失败的错误（如果没有打开的模态框）
			console.log('[签署表单] 无需关闭旧模态框');
		}

		// T009: 构建签署表单的 HTML 结构
		const formHtml = `
            <form class="signature-form-container" id="deathbills-signature-form">
                <div class="weui-cells weui-cells_form">
					<input type="hidden" id="snCodeId" name="snCodeId" value="" />
                    <div class="weui-cell">
                        <div class="weui-cell__hd"><label class="weui-label">养殖户</label></div>
                        <div class="weui-cell__bd">
                            <select id="faremsName" name="faremsName" class="signature-select" required>
                                <option value="">请选择养殖户</option>
                            </select>
                        </div>
                    </div>
                    <div class="weui-cell">
                        <div class="weui-cell__hd"><label class="weui-label">管理员</label></div>
                        <div class="weui-cell__bd">
                            <select id="administrator" name="administrator" class="signature-select" required>
                                <option value="">请选择管理员</option>
                            </select>
                        </div>
                    </div>
                    <div class="weui-cell">
                        <div class="weui-cell__hd"><label class="weui-label">服务部经理</label></div>
                        <div class="weui-cell__bd">
                            <select id="reviewer" name="reviewer" class="signature-select" required>
                                <option value="">请选择服务部经理</option>
                            </select>
                        </div>
                    </div>
                    <div class="weui-cell">
                        <div class="weui-cell__hd"><label class="weui-label">签署方式</label></div>
                        <div class="weui-cell__bd">
                            <select class="signature-select" id="signMethod" name="signMethod" required>
                                <option value="1">签字</option>
                            </select>
                        </div>
                    </div>
                </div>
            </form>
        `;

		// T008: 显示 WeUI 模态框，标题为"猪只死淘确认单-新增签署"
		$.modal({
			title: '猪只死淘确认单-新增签署',
			text: formHtml,
			autoClose: false, // ⚠️ 关键：禁止按钮点击后自动关闭模态框
			buttons: [{
					text: '取消',
					className: 'default',
					onClick: function() {
						console.log('[签署表单] 用户取消签署');
						$.closeModal();
					}
				},
				{
					text: '上传并签署',
					onClick: function() {
						console.log('[签署表单] 点击上传并签署按钮');
						_submitSignatureForm(deathRecord);
						return false; // 阻止自动关闭（双重保险）
					}
				}
			]
		});

		// T010: 延迟初始化 Select2，确保 DOM 就绪（参考 research.md Decision 3）
		setTimeout(() => {
			console.log('[签署表单] 模态框已显示，DOM 就绪');

			// 从 #print-code-id 获取死亡记录 ID 并赋值给 #snCodeId
			const deathRecordId = $('#print-code-id').val();
			$('#snCodeId').val(deathRecordId);
			console.log('[签署表单] 死亡记录ID已赋值:', deathRecordId);

			_initSelect2Dropdowns(deathRecord);
		}, 100);
	}

	/**
	 * 参考 yy.html 项目（Line 1826-1939）：初始化 Select2 下拉框
	 * 严格按照 yy.html 的实现来调用 API
	 * @param {Object} deathRecord - 死亡记录数据
	 */
	const _initSelect2Dropdowns = (deathRecord) => {
		console.log('[签署表单] 开始初始化 Select2 下拉框（参考 yy.html 实现）');

		// 参考 yy.html:1826-1861 - 养殖户下拉框
		try {
			$(`#faremsName`).select2({
				allowClear: true,
				language: 'zh-CN',
				placeholder: '请选择养殖户...', //默认文字提示
				dropdownParent: $('.weui-dialog'), // 修复在模态框中的定位问题
				ajax: {
					url: `${Utils.CurDomain.CBSUrl}/fosterfarmers/by/q`,
					dataType: 'json',
					type: 'GET',
					beforeSend: Utils.AjaxBeforeSend,
					data: function(params) {
						// ⚠️ 关键：参数必须是大写，且条件传递 SearchInfo
						return {
							PageSize: 10, // 大写 P
							PageIndex: (params.page || 1) - 1, // 大写 P，支持分页
							...(Utils.IsNotNull(params.term) ? {
								SearchInfo: params.term
							} : {}), // 大写 S，条件传递
						};
					},
					processResults: function(data, params) {
						params.page = params.page || 1;
						console.log('[签署表单] 养殖户数据加载:', data);

						// ⚠️ 关键：访问 data.data.items
						let _data = data.data.items.map((item) => {
							item.text = `${item.name}(${item.phone})`;
							return item;
						});
						return {
							results: _data, // 后台返回的数据集
							pagination: {
								more: params.page < data.data.totalPages, // 支持分页
							},
						};
					},
					minimumInputLength: 1, // ⚠️ 关键：必须输入至少1个字符
					cache: true,
					delay: 700, //等待用户输入完后的 在等700毫秒 进行搜索
					error: Utils.AjaxError,
				},
			});

			console.log('[签署表单] 养殖户 Select2 初始化完成');

		} catch (error) {
			console.error('[签署表单] 养殖户 Select2 初始化失败:', error);
			$.toptip('加载失败，请刷新页面', 'warning');
		}

		// 参考 yy.html:1901-1939 - 管理员下拉框
		try {
			$(`#administrator`).select2({
				language: 'zh-CN',
				allowClear: true, //允许清空
				placeholder: '请选择管理员...', //默认文字提示
				dropdownParent: $('.weui-dialog'), // 修复在模态框中的定位问题
				ajax: {
					url: Utils.CurDomain.EmployeeMgtUrl + `/emplrecds/by/q`,
					dataType: 'json',
					type: 'GET',
					beforeSend: Utils.AjaxBeforeSend,
					data: function(params) {
						// ⚠️ 关键：参数必须是小写，添加 status: true，不传递 jobStation
						return {
							status: true, // ⚠️ 关键参数
							pagesize: 10, // 小写
							pageindex: (params.page || 1) - 1, // 小写，支持分页
							...(Utils.IsNotNull(params.term) ? {
								searchinfo: params.term
							} : {}), // 小写，条件传递
						};
					},
					cache: true,
					delay: 700, //等待用户输入完后的 在等700毫秒 进行搜索
					//minimumInputLength: 1, // 只有当输入长度大于或等于1时，才会触发搜索
					processResults: function(data, params) {
						params.page = params.page || 1;
						console.log('[签署表单] 管理员数据加载:', data);

						// ⚠️ 关键：访问 data.data.items，使用 numCode 作为 id，显示 phone
						let _data = data.data.items.map((item) => {
							item.id = item.numCode; // 使用 numCode 作为 id
							item.text = `${item.name}(${item.phone})`; // 显示 phone
							item.name = item.name;
							return item;
						});
						return {
							results: _data, // 后台返回的数据集
							pagination: {
								more: params.page < data.data.totalPages, // 支持分页
							},
						};
					},
					error: Utils.AjaxError,
					//minimumInputLength: 1,
				},
			});

			console.log('[签署表单] 管理员 Select2 初始化完成');

		} catch (error) {
			console.error('[签署表单] 管理员 Select2 初始化失败:', error);
			$.toptip('加载失败，请刷新页面', 'warning');
		}

		// 参考 yy.html:1862-1900 - 服务部经理下拉框
		try {
			$(`#reviewer`).select2({
				language: 'zh-CN',
				allowClear: true, //允许清空
				placeholder: '请选择服务部经理...', //默认文字提示
				dropdownParent: $('.weui-dialog'), // 修复在模态框中的定位问题
				ajax: {
					url: Utils.CurDomain.EmployeeMgtUrl + `/emplrecds/by/q`,
					dataType: 'json',
					type: 'GET',
					beforeSend: Utils.AjaxBeforeSend,
					data: function(params) {
						// ⚠️ 关键：参数必须是小写，添加 status: true，不传递 jobStation
						return {
							status: true, // ⚠️ 关键参数
							pagesize: 10, // 小写
							pageindex: (params.page || 1) - 1, // 小写，支持分页
							...(Utils.IsNotNull(params.term) ? {
								searchinfo: params.term
							} : {}), // 小写，条件传递
						};
					},
					cache: true,
					delay: 700, //等待用户输入完后的 在等700毫秒 进行搜索
					//minimumInputLength: 1, // 只有当输入长度大于或等于1时，才会触发搜索
					processResults: function(data, params) {
						params.page = params.page || 1;
						console.log('[签署表单] 服务部经理数据加载:', data);

						// ⚠️ 关键：访问 data.data.items，使用 numCode 作为 id，显示 phone
						let _data = data.data.items.map((item) => {
							item.id = item.numCode; // 使用 numCode 作为 id
							item.text = `${item.name}(${item.phone})`; // 显示 phone
							item.name = item.name;
							return item;
						});
						return {
							results: _data, // 后台返回的数据集
							pagination: {
								more: params.page < data.data.totalPages, // 支持分页
							},
						};
					},
					error: Utils.AjaxError,
					//minimumInputLength: 1,
				},
			});

			console.log('[签署表单] 服务部经理 Select2 初始化完成');

		} catch (error) {
			console.error('[签署表单] 服务部经理 Select2 初始化失败:', error);
			$.toptip('加载失败，请刷新页面', 'warning');
		}

		//签署方式下拉框
		try {
			$(`#signMethod`).select2({
				dropdownParent: $('.weui-dialog'), // 修复在模态框中的定位问题
				minimumResultsForSearch: Infinity
			})
		} catch (error) {
			//TODO handle the exception
		}
	}

	/**
	 * 参考 yy.html 项目：将图片URL转换为File对象
	 * @param {string} url - 图片URL
	 * @returns {Promise<File>} File对象
	 */
	const urlToFile = async (url, filename = 'image.jpeg', quality = 0.9) => {
		try {
			const response = await fetch(url, {
				method: 'GET',
				headers: {
					Accept: 'application/json',
				},
				mode: 'cors', // 明确指定CORS模式
			});

			if (!response.ok) {
				toastr.error(`下载失败: ${res.status}`);
				return null;
			}
			const blob = await response.blob();
			return new File([blob], filename, {
				type: blob.type
			});
		} catch (error) {
			console.error('[签署] URL转File失败:', url, error);
			throw error;
		}
	}

	/**
	 * T021: 提交签署表单
	 * 参考 yy.html 项目的签署任务创建逻辑
	 * @param {Object} deathRecord - 死亡记录数据
	 */
	const _submitSignatureForm = async (deathRecord) => {
		const form = $('#deathbills-signature-form');
		// 1. 获取养殖户数据
		const faremsNameData = $('#faremsName').select2('data');
		if (faremsNameData && !faremsNameData[0].id) {
			$.toptip('请选择养殖户', 'warning');
			return;
		}
		const faremsNames = faremsNameData[0].text.match(/^(.+?)\((\d{11})\)$/);
		if (!faremsNames || faremsNames.length < 3) {
			$.toptip('养殖户信息格式错误，请联系管理员!', 'warning');
			return;
		}
		// 2. 获取管理员数据
		const administratorData = $('#administrator').select2('data');
		if (administratorData && !administratorData[0].id) {
			$.toptip('请选择管理员', 'warning');
			return;
		}
		const administrators = administratorData[0].text.match(/^(.+?)\((\d{11})\)$/);
		if (!administrators || administrators.length < 3) {
			$.toptip('管理员信息格式错误，请联系管理员!', 'warning');
			return;
		}
		// 3. 获取服务部经理数据
		const reviewerData = $('#reviewer').select2('data');
		if (reviewerData && !reviewerData[0].id) {
			$.toptip('请选择服务部经理', 'warning');
			return;
		}
		const reviewers = reviewerData[0].text.match(/^(.+?)\((\d{11})\)$/);
		if (!reviewers || reviewers.length < 3) {
			$.toptip('服务部经理信息格式错误，请联系管理员!', 'warning');
			return;
		}
		// T038: 显示 loading（在获取数据之后）
		$.showLoading('签署中...');
		//关闭模态框
		$.closeModal();
		// T045: 错误日志 - 记录开始时间
		const startTime = Date.now();

		try {
			if (!pdfListForUpload || pdfListForUpload.length === 0) {
				console.error('[签署] PDF未生成或为空:', {
					pdfListForUpload: pdfListForUpload,
					isArray: Array.isArray(pdfListForUpload),
					length: pdfListForUpload ? pdfListForUpload.length : 'undefined'
				});
				throw new Error('PDF未生成，请重新尝试');
			}

			// T029: 上传 PDF + 附件
			const formData = {
				signInOrder: true,
			};
			formData.docs = [];
			formData.attaches = [];
			form.serializeArray().forEach(({
				name,
				value
			}) => {
				formData[name] = value;
			});

			let formFile = new FormData();

			// 严格按照 yy.html:417 的实现
			for (let index = 0; index < pdfListForUpload.length; index++) {
				const element = pdfListForUpload[index];
				formFile.append('DocStrings', JSON.stringify({
					fileName: element.name,
					fileContent: element.html
				}));
			}

			for (let i = 0; i < pdfListForImageUpload.length; i++) {
				try {
					const file = await urlToFile(pdfListForImageUpload[i]);
					if (file) {
						formFile.append('Attaches', file);
						console.log(`[签署] 附件 ${i + 1}/${pdfListForImageUpload.length} 添加成功`);
					} else {
						console.warn(`[签署] 附件 ${i + 1}/${pdfListForImageUpload.length} 转换失败`);
					}
				} catch (error) {
					console.error(`[签署] 附件 ${i + 1}/${pdfListForImageUpload.length} 处理失败:`, error);
				}
			}

			const uploadResult = await SignTaskApi.uploadHtml(formFile);
			if (!uploadResult.isSucceed) {
				$.toptip(res.msg, 'warning');
				return;
			}
			// 获取表单数据
			let _index = 0;
			for (let index = 0; index < uploadResult.data.length; index++) {
				const element = uploadResult.data[index];
				if (element.fileType === 'doc') {
					_index = index + 1;
					let _docs = {
						docName: element.fileName,
						docFileId: element.fileId,
						docId: `${deathRecord.bizFormObj.billNo}_${_index}`,
						fields: [],
					};
					_docs.fields.push(
						...[
							PrintHtmlToPdf.setFieldSign(`faremsName-sign_${_index}`, '养殖户签名', '养殖户'),
							PrintHtmlToPdf.setFieldSign(`administrator-sign_${_index}`, '管理员签名', '管理员'),
							PrintHtmlToPdf.setFieldSign(`reviewer-sign_${_index}`, '服务部经理签名', '服务部经理'),
						],
					);
					formData.docs.push(_docs);
				}
				if (element.fileType === 'attach') {
					formData.attaches.push({
						attachName: element.fileName,
						attachFileId: element.fileId,
						attachId: `${element.fileId}_${index}`,
					});
				}
			}

			const _docs = uploadResult.data
				.map(item => item.fileType === "doc" ? item : null)
				.filter(Boolean);
			formData.actors = [
				PrintHtmlToPdf.setActor({
					actorId: `养户_${faremsNames[1]}`,
					actorName: '养殖户',
					identNameForMatch: faremsNames[1],
					notifyAddress: faremsNames[2],
					fieldDocId: deathRecord.bizFormObj.billNo,
					fieldDocIds: Array.from({
						length: _docs.length
					}, (_, i) => i + 1),
					fieldName: '养殖户签名',
					fieldId: 'faremsName-sign',
					index: 0,
				}),
				PrintHtmlToPdf.setActor({
					actorId: formData.administrator,
					actorName: '管理员',
					identNameForMatch: administrators[1],
					notifyAddress: administrators[2],
					fieldDocId: deathRecord.bizFormObj.billNo,
					fieldDocIds: Array.from({
						length: _docs.length
					}, (_, i) => i + 1),
					fieldName: '管理员签名',
					fieldId: 'administrator-sign',
					index: 1,
				}),
				PrintHtmlToPdf.setActor({
					actorId: formData.reviewer,
					actorName: '服务部经理',
					identNameForMatch: reviewers[1],
					notifyAddress: reviewers[2],
					fieldDocId: deathRecord.bizFormObj.billNo,
					fieldDocIds: Array.from({
						length: _docs.length
					}, (_, i) => i + 1),
					fieldName: '服务部经理签名',
					fieldId: 'reviewer-sign',
					index: 2,
				}),
			];

			formData.orgId = deathRecord.fiOrg.id;
			formData.orgName = deathRecord.fiOrg.name;
			formData.autoBusinessIseal = false;
			formData.fromBillNo = deathRecord.bizFormObj.billNo;
			formData.signTaskSubject =
				`死亡记录_${faremsNames[1]}_${deathRecord.farmOrg.name}_${deathRecord.bizFormObj.billNo}`;
			(formData.billType = '3'), (formData.billTypeName = '死亡记录');

			const createResult = await SignTaskApi.createSomgmTasl(formData);

			$.hideLoading();

			const __res = JSON.parse(createResult);
			if (!__res.isSucceed) {
				$.toptip(createResult.msg || '签署任务创建失败', 'warning');
			} else {
				$.closeModal();
				$.toptip('签署任务创建成功', 'success');
			}

		} catch (error) {
			// T036 + T045: 错误处理和日志
			$.hideLoading();
			const totalDuration = Date.now() - startTime;
			console.error('[签署] 签署失败:', {
				error: error,
				message: error.message,
				stack: error.stack,
				billNo: deathRecord.bizFormObj.billNo,
				totalDuration: totalDuration
			});
			$.toptip(error.message || '签署失败，请重试', 'warning');
		}
	}
})(window, document, jQuery)